// 目的：为了保证路由模块的纯粹性,
//所有的路由处理函数,必须抽离到对应的路由处理函数模块中

/**
 * 在这里定义和用户相关的路由处理函数，供 /router/user.js 模块进行调用
 */
const db = require('../db/index')

// 导入bcryptjs包用来加密密码
const bcrypt = require('bcryptjs')
// 导入生成token的包
const jwt = require('jsonwebtoken')
// 导入全局的配置文件
const config = require('../config')


// 注册用户的处理函数
exports.regUser = (req, res) => {
  // 获取客户端提交到服务器的用户信息
  const userinfo = req.body

  // 判断数据是否合法
  // 不合法注册失败
  //定义查询用户的SQL语句
  const sql = `select * from ev_users where phone=?`
  //判断sql语句，判断手机号是否被占用
  db.query(sql, [userinfo.phone], function (err, results) {
    // 执行 SQL 语句失败
    if (err) {
      return res.cc(err)
    }
    // 手机号已注册
    if (results.length > 0) {
      return res.cc('手机号已注册账号，请注意！')
    }

    // TODO: 手机号可用，继续后续流程...

    // 调用bcrypt.hashSync()对密码加密
    userinfo.password = bcrypt.hashSync(userinfo.password, 10)

    //向数据库内插入新用户（注册）
    //定义插入新用户的SQL语句
    const sql = 'insert into ev_users set ?'
    // 调用db.query()执行SQL语句
    db.query(sql, { phone: userinfo.phone, password: userinfo.password }, function (err, results) {
      // 判断SQL语句是否执行成功
      if (err) return res.cc(err)

      // 判断影响行数是否为1
      if (results.affectedRows !== 1) {
        return res.cc('注册用户失败')
      }
      //成功
      res.send({ code: 200, message: '注册成功' })
    })

  })

}

// 手机验证码的处理函数
exports.regPhone = (req, res) => {
  // 获取客户端提交到服务器的用户信息
  const info = req.body
  //定义查询用户的SQL语句
  const sql = `select * from ev_users where phone=?`
  //判断sql语句，判断手机号是否被占用
  db.query(sql, [info.phone], function (err, results) {
    // 执行 SQL 语句失败
    if (err) return res.cc(err)

    // 手机号已注册
    if (results.length > 0) {
      return res.cc('该手机号已注册账号，请注意！')
    }

    // TODO: 手机号可用，继续后续流程，生成随机6位验证码...
    const phonecode = parseInt((Math.random() * 9 + 1) * 100000)
    res.send({ code: 200, data: { code: phonecode } })

  })

}

// 登录的处理函数
exports.login = (req, res) => {
  // 获取客户端提交到服务器的用户信息
  const userinfo = req.body
  // 定义SQL语句
  const sql = 'select * from ev_users where phone=?'
  // 执行SQL语句，根据手机号查询用户的信息
  db.query(sql, userinfo.phone, (err, results) => {
    // 执行SQL语句失败
    if (err) return res.cc(err)
    // 执行SQL语句成功，但是获取到的数据条数不等于1
    if (results.length !== 1) return res.send({ code: 201, message: '该手机号尚未注册，请注册' })
    // 判断密码是否与数据库中对应账号密码一致
    const compareResult = bcrypt.compareSync(userinfo.password, results[0].password)
    if (!compareResult) return res.send({ code: 202, message: '密码错误' })
    
    if(results[0].isBanned ==1) return res.send({code:203,message:'该账号已被冻结，请联系管理员'})
    //登录成功
    //TODO 在服务器端生成 Token的字符串
    const user = { ...results[0], password: '', user_pic: '' }
    // 对用户的信息进行加密，生成Token字符串
    const tokenStr = jwt.sign(user, config.jwtSecretKey, { expiresIn: config.expiresIn })

    let newresults = JSON.parse(JSON.stringify(results, ['id', 'name']));
    res.send({
      code: 200,
      message: '登录成功',
      data: {
        token: 'Bearer ' + tokenStr,
        result: newresults
      }
    })
  })


}

// 退出登录的处理函数
exports.logout = (req, res) => {
  // 这里没做逻辑处理，未来可以在表中设个值，为该账号是否在登录状态
  res.send({
    code: 200,
    message: '退出成功',
  })

}
